package controlsystem;

import java.util.ArrayList;
import java.util.Date;

import managesystem.Student;
import tracksystem.Activity;
import tracksystem.SchoolActivity;
import controlsystem.Milestone;

/**
 * MilestoneController beheert het toevoegen van milestones door de student.
 * MilestoneController moet de huidige milestones doorgeven aan het dashboard.
 */

/**
 * @author r0254853
 *
 */
public class MilestoneController {
	
	private ArrayList<Milestone> milestones;
	private Student currentStudent;
	
	/**
	 * 
	 * @param currentStudent de huidige student
	 */
	public MilestoneController(Student currentStudent){
		this.currentStudent = currentStudent;
		milestones = currentStudent.getMilestones();
	}
	
	/**
	 * 
	 * @param course
	 * @param description
	 * @param endDate
	 * @param type
	 * @param value
	 */
	public void makeMilestone(Course course, String description, Date endDate, String type, int value){
		Milestone milestone = new Milestone(course, description, endDate, type, value);
		currentStudent.addMilestone(milestone);
		milestones = currentStudent.getMilestones();
	}
	
	/**
	 * Kijkt na of de currentStudent genoeg heeft gedaan om de  
	 * milestone te bereiken.
	 * @param days aantal dagen voordat de milestone moet afgehandeld zijn.
	 */
	private ArrayList<Long> checkprogress(){
		ArrayList<Long> progresses = new ArrayList<Long>();
		for(int i = 0; i < milestones.size();i++){
			long progress = progressMilestone(milestones.get(i));
			progresses.add(progress);
		}
		return progresses;
	}
	
	/**
	 * Controlleerd hoeveel er al gedaan is voor een bepaalde milestone
	 * @param milestone
	 * @return
	 */
/*	private int progressMilestone(Milestone milestone){
		Course course = milestone.getCourse();
		ArrayList<Activity> activities = currentStudent.getAct();
		Date date = milestone.getDate();
		//controlleren of milestone # pagina's als doel heeft en het aantal pagina's
		//berekenen.
		if(milestone.getType().equals("pagina's")){
			for(int i = 0; i<activities.size(); i++){
				Activity activity = activities.get(i);
				if(activity.getType().equals("schoolActivity")){
				Course courseActivity =	((SchoolActivity) activity).getCourse();
					int pages = 0;
					Date activityDate = activity.getStart();
					if(course == courseActivity && courseActivity != null && activityDate.before(date) == true){
						pages = pages + ((SchoolActivity) activity).getPages();
					}
				}
			}
		}
		
		//controlleren of milestone # uren als doel heeft en het aantal uren
		//berekenen.
		if(milestone.getType().equals("uren")){
			for(int i = 0; i<activities.size(); i++){
				Activity activity = activities.get(i);
				if(activity.getType().equals("schoolActivity")){
					Course courseActivity =	((SchoolActivity) activity).getCourse();
					int duration = 0;
					Date activityDate = activity.getStart();
					if(course == courseActivity && courseActivity != null && activityDate.before(date) == true){
						duration = duration + activity.getDuration();
					}
				}
			}
		}
	}
*/
	
	/**
	 * Controlleerd hoeveel er al gedaan is voor een bepaalde milestone
	 * @param milestone
	 * @return aantal pagina's of tijd dat al gedaan is voor de milestone (de tijd in miliseconden)
	 */
	private long progressMilestone(Milestone milestone){
		Course course = milestone.getCourse(); //over welk vak gaat de milestone
		ArrayList<Activity> activities = currentStudent.getAct(); //de lijst van activiteiten ophalen
		Date date = milestone.getDate(); //de datum waarop de milestone is aangemaakt
		long pagesOrDuration = 0;
		//iteratie over alle activiteiten om het aantal pagina's of uren te bereken naargelang
		//de doelstelling van de milestone
		for(int i = 0; i<activities.size(); i++){
			Activity activity = activities.get(i); //haalt een activiteit op
			//controle of de activiteit een schoolActivity is
			if(activity instanceof SchoolActivity){
				Course courseActivity =	((SchoolActivity) activity).getCourse(); //ophalen op welke course de activiteit betrekking heeft
				//controle of de course overeen komt
				if(courseActivity == course){
					//controlleren of milestone # pagina's als doel heeft en het aantal pagina's
					//berekenen.
					if(milestone.getType().equals("pagina's")){
						Date activityDate = activity.getStart();
						if(course == courseActivity && courseActivity != null && activityDate.before(date) == true){
							pagesOrDuration = pagesOrDuration + ((SchoolActivity) activity).getPages(); //hier is pagesOrDuration de pagina's
						}
					}
					//controlleren of milestone # uren als doel heeft en het aantal uren
					//berekenen.
					if(milestone.getType().equals("uren")){
						Date activityDate = activity.getStart();
						if(course == courseActivity && courseActivity != null && activityDate.before(date) == true){
							pagesOrDuration = pagesOrDuration + activity.getDuration(); //hier is pagesOrDuration de tijd
						}
					}
				}
			}
		}
		return pagesOrDuration;
	}
	
	/**
	 * Retourneert een arraylist met informatie over de verschillende milestones
	 * met commentaar hoe goed/slecht er gewerkt is aan de milestone
	 * @return een arraylist met Strings
	 */
	public ArrayList<String> getNotifications(){
		ArrayList<String> notifications = new ArrayList<String>();
		ArrayList<Long> progresses = checkprogress();
		for(int i = 0; milestones.size() > i; i++){
			Milestone milestone = milestones.get(i);
			String description = milestone.getDescription();
			String type = milestone.getType();
			int value = milestone.getValue();
			long progress = progresses.get(i);
			String notification = "milestone( " + description + "):" + progress + " / " + value + " " + type;
			notifications.add(notification);
		}
		return notifications;
	}
	
	/**
	 * retourneert de milestones op van de currentStudent
	 * @return een arraylist van milestones
	 */
	public ArrayList<Milestone> loadUserMilestones(){
		return milestones;
	}
	
	/**
	 * retourneert welke milestones al behaald zijn door de student
	 * @return een lijst met alle behaald milestones
	 */
	public ArrayList<Milestone> completedMilestones(){
		ArrayList<Long> progresses = checkprogress();
		ArrayList<Milestone> completedMilestones = new ArrayList<Milestone>();
		for(int i = 0; i<milestones.size(); i++){
			long progress = progresses.get(i);
			int value = milestones.get(i).getValue();
			if(progress == value){
				completedMilestones.add(milestones.get(i));
			}
		}
		return completedMilestones;
	}
}
